import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from collections import Counter

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号


colors = ['#F1948A','#F6DDCC', '#AED6F1','#FCF3CF','#F9E79F','#E5E8E8', '#F1948A', '#D0ECE7', '#D2B4DE',
         '#117A65','#FAE5D3','#34495E','#DC7633','#D35400','#0E6251','#E8F8F5','#D4E6F1','#FADBD8','#E59866']

#读数据集
df=pd.read_csv("./data/vgsales.csv")
df.head(10)

#观察数据集
df.info()

#
df.isnull().sum()

#清洗数据集
df = df.dropna() # 删除缺失值
# 将Year的数据类型转换为int
df['Year'] = df['Year'].astype(int)



#全球游戏销售额发展趋势
year_sales_glo = df.loc[:, ['Name', 'Year', 'Global_Sales']].groupby(by='Year').sum()
plt.figure(figsize=(50, 50))
plt.plot(year_sales_glo.index, year_sales_glo['Global_Sales'], marker='o', linestyle='-', color=colors[0])
plt.title('全球游戏销售额发展趋势')
plt.xlabel('年份')
plt.ylabel('总销售额（百万美元）')
plt.grid(True)
plt.show()

#不同地区的游戏销售额发展趋势
year_sales = df.loc[:, ['Name',
                        'Year',
                        'NA_Sales',
                        'EU_Sales',
                        'JP_Sales', 'Other_Sales']].groupby(by='Year').sum()
plt.figure(figsize=(10, 6))
plt.plot(year_sales.index, year_sales['NA_Sales'], label="北美销售额", marker='o', linestyle='-',color=colors[0])
plt.plot(year_sales.index, year_sales['EU_Sales'], label="欧洲销售额", marker='o', linestyle='-',color=colors[1])
plt.plot(year_sales.index, year_sales['JP_Sales'], label="日本销售额", marker='o', linestyle='-',color=colors[2])
plt.plot(year_sales.index, year_sales['Other_Sales'], label="其他地区销售额", marker='o', linestyle='-',color=colors[3])
plt.title('不同地区的游戏销售额发展趋势')
plt.xlabel('年份')
plt.ylabel('总销售额（百万美元）')
plt.legend()
plt.grid(True)
plt.show()

#不同地区销售额占比
total_sales_by_region = df[['NA_Sales', 'EU_Sales', 'JP_Sales', 'Other_Sales']].sum()
global_sales = total_sales_by_region.sum()

labels = total_sales_by_region.index
sizes = (total_sales_by_region / global_sales) * 100
plt.figure(figsize=(10, 6))
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140,colors=plt.cm.Paired.colors)
plt.title('不同地区总销售额占比')
plt.axis('equal')
plt.show()


#全球销售额TOP10的游戏
top10_games = df.groupby('Name')['Global_Sales'].sum().sort_values(ascending=False).head(10)
# 创建一个空白的词云对象
wordcloud = WordCloud(width=1000, height=800, background_color='white').generate_from_frequencies(top10_games)
# 绘制词云图
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title("全球销售额TOP10的游戏", fontsize=15)
plt.axis('off')  # 不显示坐标轴
plt.show()





#不同地区游戏销售量趋势
yearly_sales = df.groupby('Year').agg({
    'Global_Sales': 'sum',
    'NA_Sales': 'sum',
    'EU_Sales': 'sum',
    'JP_Sales': 'sum',
    'Other_Sales': 'sum'
}).reset_index()
plt.figure(figsize=(10, 6))
plt.plot(yearly_sales['Year'], yearly_sales['Global_Sales'], marker='o', linestyle='-', label='Global Sales', color=colors[0])
plt.plot(yearly_sales['Year'], yearly_sales['NA_Sales'], marker='o', linestyle='-', label='NA Sales', color=colors[1])
plt.plot(yearly_sales['Year'], yearly_sales['EU_Sales'], marker='o', linestyle='-', label='EU Sales', color=colors[2])
plt.plot(yearly_sales['Year'], yearly_sales['JP_Sales'], marker='o', linestyle='-', label='JP Sales', color=colors[3])
plt.plot(yearly_sales['Year'], yearly_sales['Other_Sales'], marker='o', linestyle='-', label='Other Sales', color=colors[4])
plt.title('不同地区游戏销售量趋势')
plt.xlabel('年份')
plt.ylabel('销售总量（百万美元）')
plt.legend()
plt.grid(True)
plt.show()


#全球销售量TOP10的游戏
top10_games = df.groupby('Name')['Global_Sales'].count().sort_values(ascending=False).head(10)
# 创建一个空白的词云对象
wordcloud = WordCloud(width=1000, height=800, background_color='white').generate_from_frequencies(top10_games)
# 绘制词云图
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title("全球销售量TOP10的游戏", fontsize=15)
plt.axis('off')  # 不显示坐标轴
plt.show()


# 获取全球销售量前10的游戏数据
top10_games = df.groupby('Name')['Global_Sales'].sum().sort_values(ascending=False).head(10)

# 绘制柱状图
plt.figure(figsize=(10, 6))
top10_games.plot(kind='bar', color=colors)
plt.title('全球销售量前10的游戏')
plt.xlabel('游戏')
plt.ylabel('全球销量（百万美元）')
plt.xticks(rotation=45)  # 以便更好地展示游戏名称
plt.show()



#####游戏类型分析

#不同类型游戏全球销售额占比
genre_sales = df.groupby('Genre')['Global_Sales'].sum()
plt.figure(figsize=(8, 8))
plt.pie(genre_sales, labels=genre_sales.index, autopct='%1.1f%%', startangle=140, colors=plt.cm.Paired.colors)
plt.title('不同类型游戏全球销售额占比')
plt.axis('equal')  # Equal aspect ratio ensures that the pie is drawn as a circle.
plt.show()

genre_sales = df.groupby('Genre')['NA_Sales'].sum()
# Plotting the pie chart
plt.figure(figsize=(8, 8))
plt.pie(genre_sales, labels=genre_sales.index, autopct='%1.1f%%', startangle=140, colors=plt.cm.Paired.colors)
plt.title('不同类型游戏北美地区销售额占比')
plt.axis('equal')  # Equal aspect ratio ensures that the pie is drawn as a circle.
plt.show()

genre_sales = df.groupby('Genre')['EU_Sales'].sum()
# Plotting the pie chart
plt.figure(figsize=(8, 8))
plt.pie(genre_sales, labels=genre_sales.index, autopct='%1.1f%%', startangle=140, colors=plt.cm.Paired.colors)
plt.title('不同类型游戏欧洲地区销售额占比')
plt.axis('equal')  # Equal aspect ratio ensures that the pie is drawn as a circle.
plt.show()

genre_sales = df.groupby('Genre')['JP_Sales'].sum()
# Plotting the pie chart
plt.figure(figsize=(8, 8))
plt.pie(genre_sales, labels=genre_sales.index, autopct='%1.1f%%', startangle=140, colors=plt.cm.Paired.colors)
plt.title('不同类型游戏日本地区销售额占比')
plt.axis('equal')  # Equal aspect ratio ensures that the pie is drawn as a circle.
plt.show()

genre_sales = df.groupby('Genre')['Other_Sales'].sum()
# Plotting the pie chart
plt.figure(figsize=(8, 8))
plt.pie(genre_sales, labels=genre_sales.index, autopct='%1.1f%%', startangle=140, colors=plt.cm.Paired.colors)
plt.title('不同类型游戏其他地区销售额占比')
plt.axis('equal')  # Equal aspect ratio ensures that the pie is drawn as a circle.
plt.show()

#不同游戏类型在不同地区销售额折线图
genre_sale=df.groupby('Genre').agg(NAsales=('NA_Sales','sum'),EUsales=('EU_Sales','sum'),
                                   JPsales=('JP_Sales','sum'),Othsales=('Other_Sales','sum'),
                                   Glosales=('Global_Sales','sum')).sort_values(by='Genre')
x = genre_sale.index
y = genre_sale['Glosales']
z = genre_sale['Othsales']
plt.xticks(rotation=30)
plt.plot(x, y, label='Global Sales',color=colors[0])
plt.plot(x, z, label='Other Sales',color=colors[1])
plt.legend()
for a, b in zip(x, y):
    plt.text(a, b + 10, '%.2f' % b, ha='center')
for a, b in zip(x, z):
    plt.text(a, b + 10, '%.2f' % b, ha='center')
plt.xlabel('游戏类型')
plt.ylabel('游戏销售额（百万美元）')
plt.title('全球、其他地区不同类型游戏销售额趋势')
plt.tight_layout()
plt.show()
c = genre_sale['NAsales']
d = genre_sale['EUsales']
e = genre_sale['JPsales']
plt.plot(x, c, label='NA Sales',color=colors[0])
plt.plot(x, d, label='EU Sales',color=colors[1])
plt.plot(x, e, label='JP Sales',color=colors[2])
plt.legend()
plt.xticks(rotation=30)
for a, b in zip(x, c):
    plt.text(a, b + 10, '%.2f' % b, ha='center')
for a, b in zip(x, d):
    plt.text(a, b + 10, '%.2f' % b, ha='center')
for a, b in zip(x, e):
    plt.text(a, b + 10, '%.2f' % b, ha='center')
plt.xlabel('游戏类型')
plt.ylabel('游戏销售额（百万美元）')
plt.title('不同地区不同类型游戏销售额趋势')
plt.tight_layout()
plt.show()


#不同地区各游戏类型销售量
Gen_num = df.groupby('Genre').agg({
    'NA_Sales': 'count',
    'JP_Sales': 'count',
    'EU_Sales': 'count',
    'Other_Sales': 'count'
}).reset_index().sort_values(by=['NA_Sales', 'JP_Sales', 'EU_Sales', 'Other_Sales'], ascending=False)
# 计算总销售量
Gen_num['Total'] = Gen_num['NA_Sales'] + Gen_num['EU_Sales'] + Gen_num['JP_Sales'] + Gen_num['Other_Sales']
Gen_num.sort_values(by='Total', inplace=True, ascending=False)
# 绘制堆积柱形图
Gen_num.head(10).plot.bar(x='Genre', y=['NA_Sales', 'EU_Sales', 'JP_Sales', 'Other_Sales'], color=colors, stacked=True,
                          title='不同地区各游戏类型的销售量')
plt.xlabel('游戏类型')
plt.ylabel('游戏销售量')
plt.show()


####



#####游戏平台分析


#不同地区各平台销售金额
Plat_COUNT = df.groupby('Platform').agg({
    'NA_Sales': 'sum',
    'JP_Sales': 'sum',
    'EU_Sales': 'sum',
    'Other_Sales': 'sum'
}).reset_index().sort_values(by=['NA_Sales', 'JP_Sales', 'EU_Sales', 'Other_Sales'], ascending=False)
Plat_COUNT['Total'] = Plat_COUNT['NA_Sales'] + Plat_COUNT['EU_Sales'] + Plat_COUNT['JP_Sales'] + Plat_COUNT['Other_Sales']
Plat_COUNT.sort_values(by='Total', inplace=True, ascending=False)
ax = Plat_COUNT.plot.bar(
    x='Platform',
    y=['NA_Sales', 'EU_Sales', 'JP_Sales', 'Other_Sales'],
    color=colors,
    stacked=True,
    title='不同地区各平台销售金额'
)
ax.legend(["NA_Sales" , " EU_Sales", "JP_Sales", "Other_Sales"])
plt.xlabel('游戏平台')
plt.ylabel('游戏销售额（百万美元）')
# Show the plot
plt.show()

#全球销售额TOP10的游戏平台
top10_platform = df.groupby('Platform')['Global_Sales'].sum().sort_values(ascending=False).head(10)
# 创建一个空白的词云对象
wordcloud = WordCloud(width=1000, height=800, background_color='white').generate_from_frequencies(top10_platform)
# 绘制词云图
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title("全球销售额TOP10的游戏平台", fontsize=15)
plt.axis('off')  # 不显示坐标轴
plt.show()



####



####发行商分析

#历年销量最高发行商
yearly_publisher_sales = df.groupby(['Year', 'Publisher']).agg({
    'NA_Sales': 'sum',
    'JP_Sales': 'sum',
    'EU_Sales': 'sum',
    'Other_Sales': 'sum',
    'Global_Sales': 'sum'
}).reset_index()
top_publishers_by_year = yearly_publisher_sales.loc[yearly_publisher_sales.groupby('Year')['Global_Sales'].idxmax()]
plt.figure(figsize=(12, 8))
for publisher in top_publishers_by_year['Publisher'].unique():
    publisher_data = top_publishers_by_year[top_publishers_by_year['Publisher'] == publisher]
    plt.bar(publisher_data['Year'], publisher_data['Global_Sales'], label=publisher)
plt.title('历年销量最高发行商')
plt.xlabel('年份')
plt.ylabel('总销售额（百万美元）')
plt.legend()
plt.show()



#不同地区各发行商销售金额
Pub_COUNT = df.groupby('Publisher').agg({'NA_Sales':'sum',
                                         'JP_Sales':'sum',
                                         'EU_Sales':'sum',
                                         'Other_Sales':'sum'}).reset_index().sort_values(by=['NA_Sales','JP_Sales','EU_Sales','Other_Sales'],ascending=False)
Pub_COUNT['Total'] = Pub_COUNT['NA_Sales'] + Pub_COUNT['EU_Sales'] + Pub_COUNT['JP_Sales'] + Pub_COUNT['Other_Sales']
Pub_COUNT.sort_values(by='Total', inplace=True, ascending=False)
top_publishers = Pub_COUNT.head(10)
top_publishers.plot.bar(x='Publisher', y=['NA_Sales', 'EU_Sales', 'JP_Sales', 'Other_Sales'],
                        color=colors, stacked=True, title='不同地区各发行商销售金额')
plt.xlabel('游戏发行商')
plt.ylabel('游戏销售额（百万美元）')
plt.show()



#全球销售额TOP10的游戏发行商
top10_publisher = df.groupby('Publisher')['Global_Sales'].sum().sort_values(ascending=False).head(10)
# 创建一个空白的词云对象
wordcloud = WordCloud(width=1000, height=800, background_color='white').generate_from_frequencies(top10_publisher)
# 绘制词云图
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title("全球销售额TOP10的游戏发行商", fontsize=15)
plt.axis('off')  # 不显示坐标轴
plt.show()


#不同地区各游戏发行商销售量
Pub_num = df.groupby('Publisher').agg({
    'NA_Sales': 'count',
    'JP_Sales': 'count',
    'EU_Sales': 'count',
    'Other_Sales': 'count'
}).reset_index().sort_values(by=['NA_Sales', 'JP_Sales', 'EU_Sales', 'Other_Sales'], ascending=False)
# 计算总销售量
Pub_num['Total'] = Pub_num['NA_Sales'] + Pub_num['EU_Sales'] + Pub_num['JP_Sales'] + Pub_num['Other_Sales']
Pub_num.sort_values(by='Total', inplace=True, ascending=False)
# 绘制堆积柱形图
Pub_num.head(10).plot.bar(x='Publisher', y=['NA_Sales', 'EU_Sales', 'JP_Sales', 'Other_Sales'], color=colors, stacked=True,
                          title='不同地区各游戏发行商的销售量')
plt.xlabel('游戏发行商')
plt.ylabel('游戏销售量')
plt.show()


#全球销售量TOP10的游戏发行商
top10_publisher = df.groupby('Publisher')['Global_Sales'].count().sort_values(ascending=False).head(10)
# 创建一个空白的词云对象
wordcloud = WordCloud(width=1000, height=800, background_color='white').generate_from_frequencies(top10_publisher)
# 绘制词云图
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title("全球销售量TOP10的游戏发行商", fontsize=15)
plt.axis('off')  # 不显示坐标轴
plt.show()

#不同发行商发行的游戏数量Top10
top10_publisher = df['Publisher'].value_counts().head(10)
plt.figure(figsize=(10, 5))
top10_publisher.plot(kind='bar', color=colors)
plt.title('不同发行商发行的游戏数量 TOP 10')
plt.xlabel('发行商')
plt.ylabel('游戏数量')
plt.show()
####







